#!usr/bin/env python  
# -*- coding:utf-8 _*-
""" 
@author:pengfeifu
@file: day_16_numpy_array.py 
@version:
@time: 2021/11/05 
@email:1324734112@qq.com
@desc： numpy数组使用
@function：常用函数
numpy.array()
"""
import numpy

print(numpy.__version__)
# 一维数组
arr1 = numpy.array((1, 2, 3, 4, 5, 6, 7))
print(type(arr1))
print(arr1)
print("一维数组裁剪：", "下标2以后", arr1[2:], "下标3~5(不包括)", arr1[3:5], "下标5以前，不包括5", arr1[:5], "step:2", arr1[2:5:2])
print("numpy.1维数组", "*" * 100)

arr2 = numpy.array([[1, 2, 3], (2, 3, 4)])
print(arr2, "维数", arr2.ndim)
print("下标1，2所在的数字", arr2[1, 2])
# 负索引：列表下标所在的最后一个位置，比如arr[1,-1]就是4，arr[-1,-1]也是4
print("负索引：列表下标所在的最后一个位置", arr2[-1, -1])
print("数组内部类型", arr2.dtype)
print("numpy.2维数组", "*" * 100)

# 元组与列表，在Numpy.array内部能够自由转换
arr3 = numpy.array([[(1, 2, 3), (4, 5, 6)], [(1, 2, 34), (4, 6, 7)]])
print(arr3)
print("维数", arr3.ndim)
print("查找数字7位置：", arr3[1, 1, 2])
print("numpy.3维数组", "*" * 100)

# 类型转换

arr4 = numpy.array([[(1.4, 2.3, 3.5), (4, 5.1, 6)], [(1, 2, 34), (4, 6, 7.8)]])
print(arr4.dtype)  # float64
'''
更改现有数组的数据类型的最佳方法，是使用 astype() 方法复制该数组。
astype() 函数创建数组的副本，并允许您将数据类型指定为参数。
astype()dtype参数：
i - 整数
b - 布尔
u - 无符号整数
f - 浮点
c - 复合浮点数
m - timedelta
M - datetime
O - 对象
S - 字符串
U - unicode 字符串
V - 固定的其他类型的内存块 ( void )

也可以用 int ,bool,float,
'''
int_arr = arr4.astype("S")  # == int_arr=arr4.astype(int)
print(int_arr, int_arr.dtype)
print("numpy.astype，数组转换", "*" * 100)

# 数据副本,由原数据生成的副本数据，数据更改，对原数据没影响，原数据更改，对副本也没影响
arr5 = numpy.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
copy_arr = arr5.copy()
arr5[0] = 10
copy_arr[1] = 10
print("原数据,", arr5)
print("副本数据,", copy_arr)
# 每个 NumPy 数组都有一个属性 base，如果该数组拥有数据，则这个 base 属性返回 None。
if not copy_arr.base:
    print("副本数组拥有数据")
print("numpy.copy，数组复制，生成副本", "*" * 100)

# 数据视图，由原数据生成的视图数据，数据更改，间接影响原数据，原数据更改，也影响视图数据
arr6 = numpy.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
view_arr = arr6.view()
arr6[0] = 10
view_arr[1] = 10
print("原数据", arr6)
print("视图数据", view_arr)
if view_arr.base:
    print("视图数组不拥有数据")
